package LearnDataStructure.a_线性结构.例题;

/**
 * @version: 1.0
 * @Author: wuqiu
 * @date: 2023-07-04 15:40
 * @description: LeetcodeLearnAlgorithm -> LearnDataStructure.a_线性结构.例题
 */

import java.util.ArrayList;
import java.util.List;

/**
 请实现一种数据结构SetOfStacks，由多个栈组成，其中每个栈的大小为size，当前一个栈填满时，新建一个栈。
 该数据结构应支持与普通栈相同的push和pop操作。

 给定一个操作序列int[][2] ope，每个操作的第一个数代表操作类型，
 若为1，则为push操作，后一个数为应push的数字；
 若为2，则为pop操作，后一个数无意义。

 请返回一个int[][](C++为vector&ltvector&ltint>>)，为完成所有操作后的SetOfStacks，顺序应为从下到上，默认初始的SetOfStacks为空。

 保证数据合法。
 */
public class i_构造多栈合成的栈 {
    public static void main(String[] args) {
        i_构造多栈合成的栈 test = new i_构造多栈合成的栈();

    }

    public ArrayList<ArrayList<Integer>> setOfStacks(int[][] ope, int size) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        ArrayList<Integer> currentStack = new ArrayList<Integer>(size);
        result.add(currentStack);
        for (int[] KeyAndValue : ope) {
            int key = KeyAndValue[0];
            int value = KeyAndValue[1];
            if (key == 1) {//进行push
                if (currentStack.size() == size) {//当前的小栈满了
                    currentStack = new ArrayList<Integer>();//新建小栈
                    result.add(currentStack);//大栈存入新建小站
                }
                currentStack.add(value);//新建小站push
            } else {//进行pop
                if (currentStack.isEmpty()) {//当前小栈空了
                    result.remove(currentStack);//大栈移除当前小栈
                    currentStack = result.get(result.size() - 1);//当前小栈设置为目前大栈的最后一个栈
                }
                currentStack.remove(currentStack.size() - 1);//小栈pop
            }
        }
        return result;
    }
}
